IF EXISTS (SELECT * FROM SYSOBJECTS WHERE name='spCartulinaDevoluciones' and XTYPE='P')
BEGIN
	DROP PROCEDURE [dbo].[spCartulinaDevoluciones]
END
GO
CREATE PROCEDURE [dbo].[spCartulinaDevoluciones]
	 @OP VARCHAR(64)=NULL
	,@ParamAuxiliar NVARCHAR(MAX)=NULL   /* PARAMETRO AUXILIAR */
	,@ID INT=NULL
	,@FechaGrab SMALLDATETIME=NULL
	,@UsuarioGrab VARCHAR(32)=NULL
	,@CodCartulinaDevolucion INT=NULL
	,@CodCartulinaNueva INT=NULL
	,@CodCartulina INT=NULL
	,@CodPlaca VARCHAR(8)=NULL
	,@Valor NUMERIC(18,2)=NULL
	,@Observaciones VARCHAR(512)=NULL
WITH ENCRYPTION
AS
SET NOCOUNT ON
BEGIN TRY

DECLARE @AUX NVARCHAR(2048)
DECLARE @ConsecutivoTemp	INTEGER
DECLARE @Temp	INTEGER

/*****     OPERACION POR DEFECTO    *****/
IF @OP IS NULL OR @OP = ''
BEGIN
	SELECT
		t.CodCartulinaDevolucion,
		t.FechaGrab AS FechaGrab_DEVOLUCION,
		t.UsuarioGrab AS UsuarioGrab_DEVOLUCION,
		t.CodCartulinaNueva AS CodCartulinaNueva_DEVOLUCION,
		t.CodPlaca AS CodPlaca_DEVOLUCION,
		t.Valor AS Valor_DEVOLUCION,
		t.Observaciones AS Observaciones_DEVOLUCION,
		c.FechaGrab,
		c.UsuarioGrab,
		c.CodCartulina,
		c.CodRecaudo,
		c.CodCartulinaEstado,
		c.ValorCartulina,
		c.ValorTransMasivo,
		c.ValorUtilidad,
		c.ValorObligaciones
	FROM
		[dbo].[CartulinaDevoluciones] t
		inner join Cartulina c
			ON t.CodCartulina=c.CodCartulina
	ORDER BY
		t.FechaGrab DESC	
	RETURN 0
END

/*****   GENERAR DEVOLUCION  *****/
IF @OP = 'GenerarDevolucion'
BEGIN	
	BEGIN TRANSACTION
	
	--- Verifico si La Placa se encuentra Inactiva
	IF EXISTS	(
				select TOP 1 * from 
					Cartulina c 
					inner join Recaudo r 
						on c.CodRecaudo=r.CodRecaudo
					inner join Placa p
						on r.CodPlaca=p.CodPlaca
				WHERE
					c.CodCartulina=@CodCartulina
					and p.Activo=0		
				)
	begin
		select TOP 1 @AUX='La placa "'+r.CodPlaca+'" Se encuentra INACTIVA. Verifique!' 
		from 
		Cartulina c 
		inner join Recaudo r 
			on c.CodRecaudo=r.CodRecaudo				
		WHERE
			c.CodCartulina=@CodCartulina
		RAISERROR(@AUX,16,1)
		RETURN 1
	end

	--- Verifico si el Tipo de Cartulina Asociado a la Placa se encuentra INACTIVO
	IF EXISTS	(
				select TOP 1 * from 
					Cartulina c 
					inner join Recaudo r 
						on c.CodRecaudo=r.CodRecaudo
					inner join Placa p
						on r.CodPlaca=p.CodPlaca
					inner join CartulinaTipo t
						on p.CodCartulinaTipo=t.CodCartulinaTipo
				WHERE
					c.CodCartulina=@CodCartulina
					and t.Activo=0		
				)
	begin
		select TOP 1 @AUX='El Tipo de Cartulina "'+p.CodCartulinaTipo+'" Asociado a la placa "'+r.CodPlaca+'" Se encuentra INACTIVO. Verifique!'
		from 
			Cartulina c 
			inner join Recaudo r 
				on c.CodRecaudo=r.CodRecaudo				
			inner join Placa p
				on r.CodPlaca=p.CodPlaca						
		WHERE
			c.CodCartulina=@CodCartulina
		RAISERROR(@AUX,16,1)
		RETURN 1
	end

	--- Verifico si la Nueva Cartulina ya existe en la tabla "Devolucion"	
	if exists (select top 1 * from CartulinaDevoluciones where CodCartulinaNueva=@CodCartulinaNueva)
	begin
		SET @AUX='La cartulina Numero '+CONVERT(varchar(8),@CodCartulinaNueva)+' ya se encuentra relacionada a otra Devolucion. Verifique.'
		RAISERROR(@AUX,16,1)
		RETURN 1
	end
	
	--- Verifico si la Nueva Cartulina ya existe en la tabla "Cartulina"
	if exists (select top 1 * from Cartulina where CodCartulina=@CodCartulinaNueva)
	begin
		SET @AUX='La cartulina Numero '+CONVERT(varchar(8),@CodCartulinaNueva)+' ya se encuentra Registrada en la Base de datos. Verifique.'
		RAISERROR(@AUX,16,1)
		RETURN 1
	end
	
	--- Verifico que la cartulina que se desea devolver exista
	if not exists (select top 1 * from Cartulina where CodCartulina=@CodCartulina)
	begin
		SET @AUX='La cartulina Numero '+CONVERT(varchar(8),@CodCartulina)+' No se encuentra registrada en la base de datos. Verifique.'
		RAISERROR(@AUX,16,1)
		RETURN 1
	end
	
	--- Obtengo el Proximo Consecutivo
	EXEC [spSeguridadConsecutivos] @OP='ObtenerProximoConsecutivo',@CodConsecutivo='Devoluciones de Cartulina',@ProximoConsecutivo=@ConsecutivoTemp OUTPUT
	
	--- Grabo la accion en el log
	SET @AUX='Codigo Devolucion: '+CONVERT(VARCHAR(8),@ConsecutivoTemp)
	EXEC dbo.spSeguridadLogEventos_Insert @Evento='DEVOLUCION DE CARTULINA',@Detalle=@AUX
		
	----- Grabo los datos en la tabla "Cartulina_DEVOLUCIONES"
	Insert into CartulinaDevoluciones
		(
		CodCartulinaDevolucion,
		FechaGrab,
		UsuarioGrab,
		CodCartulinaNueva,
		CodPlaca,
		Valor,
		Observaciones,
		CodCartulina
		)
	select 
		@ConsecutivoTemp,
		GETDATE(),
		dbo.fnGetUsuarioSession(),
		@CodCartulinaNueva,
		r.CodPlaca,
		@Valor,
		@Observaciones,
		c.CodCartulina		
	FROM
		Cartulina c	
		INNER JOIN Recaudo r 
			ON c.CodRecaudo=r.CodRecaudo
	WHERE
		c.CodCartulina=@CodCartulina		
	
	--- Actulizo el estado de la cartulina
	UPDATE
		Cartulina
	SET
		CodCartulinaEstado='DEVUELTO'
	WHERE
		CodCartulina=@CodCartulina
						
	--- Actulizo el valor del consecutivo "Cartulinas"
	SELECT @Temp=ISNULL(MAX(CodCartulina),0) 
		FROM Cartulina

	SELECT @Temp=CASE WHEN @Temp<ISNULL(MAX(CodCartulinaNueva),0) THEN ISNULL(MAX(CodCartulinaNueva),0) ELSE @Temp END 
		FROM CartulinaDevoluciones

	UPDATE 
		[dbo].[SeguridadConsecutivos] 
	SET 
		FechaUltModific=GETDATE(),
		UsuarioUltModific=dbo.fnGetUsuarioSession(),
		ProximoConsecutivo=@Temp+1 
	WHERE 
		CodConsecutivo='Cartulinas'	
	
	--- Retorno la informacion necesaria para imprimir el Ticket Correspondiente a la devolucion generado
	SET @AUX='EXEC '+OBJECT_NAME(@@PROCID)+' @OP=''RetornarInformacionTicketDevolucion'', @CodCartulinaDevolucion='+CONVERT(NVARCHAR(8),@ConsecutivoTemp)
	EXEC sp_executeSql @AUX
	
	COMMIT TRANSACTION
	RETURN 0
END

/*****   RETORNO LA INFORMACION NECESARIA PARA IMPRIMIR EL TICKET CORRESPONDIENTE A LA DEVOLUCION GENERADA *****/
IF @OP='RetornarInformacionTicketDevolucion'
BEGIN
	
	IF @ParamAuxiliar IS NOT NULL
	BEGIN
		--- Grabo la accion en el log
		SET @AUX='Codigo Devolucion: '+CONVERT(VARCHAR(8),@CodCartulinaDevolucion)+'. '+CHAR(10)+'Motivo: '+@ParamAuxiliar
		EXEC dbo.spSeguridadLogEventos_Insert @Evento='REIMPRESION DE TICKET (DEVOLUCION)',@Detalle=@AUX
	END
	
	SELECT 
		 RIGHT(REPLICATE('0',8)+CONVERT(VARCHAR(8),d.CodCartulinaDevolucion),8) AS CodCartulinaDevolucion
		,d.FechaGrab AS FechaGrab
		,u.UserName
		,d.CodCartulinaNueva AS CodCartulinaNueva
		,d.CodPlaca AS CodPlaca
		,d.Valor AS Valor
		,d.Observaciones AS Observaciones
		,d.CodCartulina
		,RIGHT(REPLICATE('0',8)+CONVERT(VARCHAR(8),c.CodRecaudo),8) AS CodRecaudo
	FROM
		CartulinaDevoluciones d
		Inner join Cartulina c
			ON d.CodCartulina=c.CodCartulina
		Inner join SeguridadUsuario u
			ON d.UsuarioGrab=u.Login
	WHERE
		CodCartulinaDevolucion=@CodCartulinaDevolucion
		
	
RETURN 1
END

--- Si se llega a este punto es porque el @OP indicado no Existe en el Procedimiento Almacenado
IF @OP IS NOT NULL
	BEGIN
	SET @ParamAuxiliar='La Operacion "'+@OP+'" No esta definida en el Procedimiento almacenado "'+OBJECT_NAME(@@PROCID)+'", Revise!.'
	RAISERROR(@ParamAuxiliar,16,1)
	RETURN 1
END

--- CONTROLAR Y REGISTRAR LOS ERRORES
END TRY
BEGIN CATCH
	--- Recopilo la informacion del error
	DECLARE @ERROR_NUMBER INT=ERROR_NUMBER(),@ERROR_SEVERITY INT=ERROR_SEVERITY(),@ERROR_STATE INT=ERROR_STATE(),@ERROR_PROCEDURE VARCHAR(128)=ISNULL(ERROR_PROCEDURE(),OBJECT_NAME(@@PROCID)),@ERROR_LINE INT=ERROR_LINE(),@ERROR_MESSAGE VARCHAR(2048)=ERROR_MESSAGE()
	--- Si hay transacciones abiertas, hago un rollback, SE ENCIERRA EN UN (TRY-CATCH) PARA QUE NO SE MUESTRE EL ERROR: Transaction count after EXECUTE indicates a mismatching number of BEGIN and COMMIT
	IF(@@TRANCOUNT>0) BEGIN BEGIN TRY ROLLBACK TRANSACTION END TRY BEGIN CATCH END CATCH END
	--- Ejecuto el SP que controla y registra el error
	EXEC [spSeguridadMessageException] @OP='MostrarMensaje',@ERROR_NUMBER=@ERROR_NUMBER,@ERROR_SEVERITY=@ERROR_SEVERITY,@ERROR_STATE=@ERROR_STATE,@ERROR_PROCEDURE=@ERROR_PROCEDURE,@ERROR_LINE=@ERROR_LINE,@ERROR_MESSAGE=@ERROR_MESSAGE
	RETURN 1
END CATCH;
